/**
 * 
 */
package belote.service.utilisateur.metier.impl;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

import belote.model.utilisateur.Utilisateur;
import belote.service.utilisateur.metier.ServiceUtilisateur;

/**
 * @author Gwenn
 *
 */
public class ServiceUtilisateurImpl implements ServiceUtilisateur {

	// ------------------------------------------------------------- Constantes
	
	private static final String KIND = "User";
	
	private static final String PROPERTY_PASSWORD = "password";
	private static final String PROPERTY_LOGIN = "login";
	private static final String PROPERTY_MAIL = "mail";

	// --------------------------------------------------------------- Services
	
	private final DatastoreService datastore;

	// ----------------------------------------------------------- Constructeur

	public ServiceUtilisateurImpl() {
		datastore = DatastoreServiceFactory.getDatastoreService();
	}
	
	// ----------------------------------------------------- Methodes publiques
	
	@Override
	public Utilisateur recupererParId(String pId) {

		Key key = KeyFactory.createKey(KIND, pId);

		try {
			Entity entity = datastore.get(key);
			Utilisateur utilisateur = new Utilisateur();
			entityToObject(entity, utilisateur);
			
			return utilisateur;
		} catch (EntityNotFoundException e) {
			
			return null;
		}
	}

	@Override
	public Utilisateur enregistrer(Utilisateur pUtilisateur) {
		
		Entity entity = new Entity(KIND);
		objectToEntity(pUtilisateur, entity);
		
		Key key = datastore.put(entity);
		
		pUtilisateur.setId(key.getId());
				
		return pUtilisateur;
	}

	@Override
	public boolean loginExiste(String pLogin) {
		
		Query q = new Query(KIND).setKeysOnly();
		q.addFilter(PROPERTY_LOGIN, FilterOperator.EQUAL, pLogin);
		
		PreparedQuery pq = datastore.prepare(q);
		Entity entity = pq.asSingleEntity();
		
		return (entity != null);
	}

	@Override
	public boolean emailExiste(String pEmail) {
		
		Query q = new Query(KIND).setKeysOnly();
		q.addFilter(PROPERTY_MAIL, FilterOperator.EQUAL, pEmail);
		
		PreparedQuery pq = datastore.prepare(q);
		Entity entity = pq.asSingleEntity();
		
		return (entity != null);
	}
	
	// --------------------------------------------------- Methodes 'protected'
	
	protected void objectToEntity(Utilisateur pObject, Entity pEntity) {
		
		pEntity.setProperty(PROPERTY_LOGIN, pObject.getLogin());
		pEntity.setProperty(PROPERTY_PASSWORD, pObject.getPassword());
		pEntity.setProperty(PROPERTY_MAIL, pObject.getMail());
	}

	protected void entityToObject(Entity pEntity, Utilisateur pObject) {
		
		// ID
		pObject.setId(pEntity.getKey().getId());
		
		// Properties
		pObject.setLogin((String) pEntity.getProperty(PROPERTY_LOGIN)); 
		pObject.setPassword((String) pEntity.getProperty(PROPERTY_PASSWORD)); 
		pObject.setMail((String) pEntity.getProperty(PROPERTY_MAIL)); 
	}
}
